import copy
import os
import uuid

import yaml

from core.globalContext import Global_Context


def load_context_from_yaml(folder_path):
    """
    :param folder_path: 文件路径
    :return:
    """
    try:
        # 把2个文本进行拼接
        yaml_file_path = os.path.join(folder_path, "context.yaml")
        with open(yaml_file_path, "r", encoding="utf-8") as file:
            data = yaml.load(file, Loader=yaml.FullLoader)
            print(f"context.yaml数据内容: ", data)
            if data:
                Global_Context().set_by_dict(data)
    except Exception as e:
        print(f"装载yaml文件错误: {str(e)}")
        return False


# 读取单文件的yaml -- 舍弃掉。
def read_yaml(file_path):
    """
    返回yaml的数据
    :param file_path: yaml的路径
    :return:
    """
    # 调用一下全局变量的方法写入方法
    load_context_from_yaml(r"F:\pythonCode\api_project_class\api235\day07\apirun_2\data")

    case_datas = []
    with open(file_path, "r", encoding="utf-8") as file:
        case_data = yaml.full_load(file)
        # [{yaml里面的数据}]
        case_datas.append(case_data)
        # print(case_datas)
        return case_datas


def load_yaml_files(config_path):
    """
    返回满足条件的yaml文件列表及数据
    :param config_path: Yaml存放的路径
    :return:
    """

    yaml_casedata = []  # 存储所有的数据

    load_context_from_yaml(config_path)

    # 存放在该路径的全局变量进行写入
    suite_folder = os.path.join(config_path)
    # 满足条件的列表
    file_names = [(int(yaml_file.split("_")[0]), yaml_file) for yaml_file in os.listdir(suite_folder)
                  if yaml_file.endswith(".yaml") and yaml_file.split("_")[0].isdigit()]

    # 排序，排序只保留文件名即可
    file_names.sort()
    file_names = [yaml_file[-1] for yaml_file in file_names]

    # 加载每个文件的数据给到yaml_caseInfos
    for file_name in file_names:
        yaml_file_path = os.path.join(suite_folder, file_name)
        with open(yaml_file_path, "r", encoding="utf-8") as yaml_file:
            casedata = yaml.full_load(yaml_file)
            # [{yaml里面的数据}]
            yaml_casedata.append(casedata)

    # 所有的测试用例
    return yaml_casedata


#  把yaml的格式处理成我们规定的格式
def yaml_case_parser(config_path):
    """
    :param config_path: 文件的路径
    :return: {
            "case_names": case_names   #  所有测试用例对应的标题 []
            "case_infos": case_infos,  #  所有的测试用例 []
    }
    """
    case_names = []
    case_infos = []

    # TODO 1: 调用对应的方法：拿到所有的yaml用例数据
    yaml_caseinfos = load_yaml_files(config_path)

    # TODO 2: 统一处理成一样的格式 （后面excel一样的处理）
    for caseinfo in yaml_caseinfos:
        # TODO 扩展: 获取ddt的数据，得到长度
        ddts = caseinfo.get("ddts", [])
        # TODO 扩展: 取到数据之后，我们需要删除ddts这个，避免有后续的影响
        if len(ddts) > 0:
            caseinfo.pop("ddts")

        if len(ddts) == 0:
            # 按照之前逻辑直接处理即可
            # 没有名字，我们自己生成一个，需要把它写到我们测试用例当中
            case_name = caseinfo.get("desc", uuid.uuid4().__str__())
            caseinfo.update({"_case_name": case_name})

            case_names.append(case_name)  # 所有的用例名称 []
            case_infos.append(caseinfo)  # 所有的测试用例 []
        else:
            # 根据ddts的数据生成多组数据
            for ddt in ddts:
                new_case = copy.deepcopy(caseinfo)
                context = new_case.get("context", {})
                ddt.update(context)
                new_case.update({"context": ddt})

                case_name = f'{caseinfo.get("desc", uuid.uuid4().__str__())}-{ddt.get("desc", uuid.uuid4().__str__())}'
                new_case.update({"_case_name": case_name})  # 需要把它写到我们测试用例当中

                case_infos.append(new_case)  # 所有的测试用例 []
                case_names.append(case_name)  # 所有的用例名称 []

    return {
        "case_names": case_names,
        "case_infos": case_infos
    }


# print(yaml_case_parser(r"F:\pythonCode\api_project_class\api235\day09\apirun_2\data"))
